package pl.rpr.rozklad;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;

class AutobusZPrzystanku {
  private String adres;
  private String numer;
  private String kierunek;

  public AutobusZPrzystanku() {
    this.adres = new String();
    this.numer = new String();
    this.kierunek = new String();
  }

  public AutobusZPrzystanku(String adr, String num, String kie) {
    this.adres = new String(adr);
    this.numer = new String(num);
    this.kierunek = new String(kie);
  }

  public String getAdres() {
    return adres;
  }

  public void setAdres(String adres) {
    this.adres = new String(adres);
  }

  public String getNumer() {
    return numer;
  }

  public void setNumer(String numer) {
    this.numer = new String(numer);
  }

  public String getKierunek() {
    return kierunek;
  }

  public void setKierunek(String kierunek) {
    this.kierunek = new String(kierunek);
  }
}

class AutobusyZPrzystankowListAdapter extends BaseAdapter {
  private List<AutobusZPrzystanku> autobusy;
  private Context                  context;

  public AutobusyZPrzystankowListAdapter(List<AutobusZPrzystanku> aut, Context con) {
    this.autobusy = aut;
    this.context = con;
  }

  public int getCount() {
    return autobusy.size();
  }

  public Object getItem(int position) {
    return autobusy.get(position);
  }

  public long getItemId(int position) {
    return 0;
  }

  public View getView(int position, View convertView, ViewGroup parent) {
    String adresAutobusu = autobusy.get(position).getAdres();
    String numerAutobusu = autobusy.get(position).getNumer();
    String kierunekAutobusu = autobusy.get(position).getKierunek();
    if (convertView == null) {
      convertView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.autobusy_z_przystankow, parent, false);
    }

    TextView numerTV = (TextView) convertView.findViewById(R.id.numerA);
    numerTV.setText(numerAutobusu);

    TextView kierunekTV = (TextView) convertView.findViewById(R.id.kierunekA);
    kierunekTV.setText(kierunekAutobusu);

    TextView adresTV = (TextView) convertView.findViewById(R.id.adresA);
    adresTV.setText(adresAutobusu);

    return convertView;
  }

}

public class AutobusyZPrzystankow extends ListActivity implements CONST {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    new Polaczenie(this).sprawdzPolaczenie();

    String adresAutobusow = getIntent().getExtras().getString("adresAutobusu");

    String htmlDoParsowania = wczytajStringAutobusowZPrzystankow(adresAutobusow);

    List<AutobusZPrzystanku> autobusy = new ArrayList<AutobusZPrzystanku>();
    autobusy = parsujAutobusyZPrzystankow(htmlDoParsowania);

    ListAdapter adapter = new AutobusyZPrzystankowListAdapter(autobusy, this);
    getListView().setAdapter(adapter);
  }

  @Override
  protected void onListItemClick(ListView parent, View view, int position, long id) {
    super.onListItemClick(parent, view, position, id);
    Intent intent = new Intent(view.getContext(), RozkladZPrzystankow.class);
    TextView adresTV = (TextView) view.findViewById(R.id.adresA);
    String adres = adresTV.getText().toString();
    intent.putExtra("adresRozkladu", adres);
    startActivity(intent);
  }

  @Override
  protected void onResume() {
    super.onResume();
    new Polaczenie(this).sprawdzPolaczenie();
  }

  @Override
  protected void onRestart() {
    super.onRestart();
    new Polaczenie(this).sprawdzPolaczenie();
  }

  private String wczytajStringAutobusowZPrzystankow(String adresAutobusow) {
    HttpClient klient = new DefaultHttpClient();
    HttpGet zadanie = new HttpGet(adresAutobusow);
    HttpResponse odpowiedz = null;
    String htmlDoParsowania = null;
    InputStream strumienWejsciowy = null;
    BufferedReader czytnik = null;
    StringBuilder stringBuilder = new StringBuilder();
    String linia = null;

    try {
      odpowiedz = klient.execute(zadanie);
      strumienWejsciowy = odpowiedz.getEntity().getContent();
      czytnik = new BufferedReader(new InputStreamReader(strumienWejsciowy, "ISO-8859-2"));
      while ((linia = czytnik.readLine()) != null) {
        stringBuilder.append(linia);
      }
      strumienWejsciowy.close();
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IllegalStateException e) {
      e.printStackTrace();
    } catch (UnsupportedEncodingException e1) {
      e1.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    htmlDoParsowania = stringBuilder.toString();
    return htmlDoParsowania;
  }

  private List<AutobusZPrzystanku> parsujAutobusyZPrzystankow(String htmlDoParsowania) {
    ArrayList<AutobusZPrzystanku> autobusy = new ArrayList<AutobusZPrzystanku>();
    Pattern patAutobusow = Pattern.compile(RE_AUTOBUSY_P);
    Matcher matAutobusow = patAutobusow.matcher(htmlDoParsowania);
    while (matAutobusow.find()) {
      String adres = matAutobusow.group(1).replace('r', 't');
      AutobusZPrzystanku tmp = new AutobusZPrzystanku(ADRES_ROZKLADOW + adres, matAutobusow.group(2),
          matAutobusow.group(3));
      autobusy.add(tmp);
    }
    return autobusy;
  }
}
